﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ESAN.Componentes.DACoreESAN.Models;

namespace ESAN.Componentes.DACoreESAN.Logic.Facade
{
    public class DACliente
    {


        static public IN_POSTULANTE ValidarUsuario(string correo)
        {

            using (var data = new InscripcionDataContext())
            {
                IN_CLIENTE cliente = data.IN_CLIENTE.FirstOrDefault(x => x.Clie_Email.Equals(correo));

                return (cliente == null ? null : data.IN_POSTULANTE.FirstOrDefault(c => c.Clie_ID == cliente.Clie_ID));
            }


        }

        /// <summary>
        /// Se obtiene un cliente
        /// </summary>
        /// <param name="ID">Identificados del Postulante</param>
        /// <returns>Objeto del tipo cliente</returns>
        static public IN_CLIENTE ObtenerCliente(int ID)
        {

            using (var data = new InscripcionDataContext())
            {
                var cliente = (from a in data.IN_POSTULANTE
                               join b in data.IN_CLIENTE on a.Clie_ID equals b.Clie_ID
                               where a.Post_ID == ID
                               select b).FirstOrDefault();
                return cliente;
                //cliente = data.IN_CLIENTE.FirstOrDefault(x => x.Clie_ID == ID);
            }


        }
        /// <summary>
        /// Se registra el idioma del cliente
        /// </summary>
        /// <param name="ID"></param>
        /// <param name="nivelLectura"></param>
        /// <param name="nivelEscritura"></param>
        /// <param name="nivelHablado"></param>
        /// <returns></returns>
        static public bool RegistrarClienteIdioma(int CLId, int idPostulante, string nombreIdioma, int nivelLectura, int nivelEscritura, int nivelHablado)
        {
            bool exito = true;

            try
            {
                IN_CLIENTE_IDIOMA idioma;
                using (var data = new InscripcionDataContext())
                {
                    //Se obtiene el cliente del postulante
                    var idCliente = data.IN_POSTULANTE.FirstOrDefault(x => x.Post_ID == idPostulante).Clie_ID;
                    idioma = new IN_CLIENTE_IDIOMA();
                    if (CLId != -1)
                    {
                        idioma = data.IN_CLIENTE_IDIOMA.FirstOrDefault(x => x.CLId_ID == CLId);
                        idioma.CLId_NomIdioma = nombreIdioma;
                        idioma.Clie_ID = int.Parse(idCliente.ToString());
                        idioma.CLId_NivEscribe = nivelEscritura.ToString();
                        idioma.CLId_NivHabla = nivelHablado.ToString();
                        idioma.CLId_NivLee = nivelLectura.ToString();
                    }
                    else
                    {
                        idioma.CLId_NomIdioma = nombreIdioma;
                        idioma.Clie_ID = int.Parse(idCliente.ToString());
                        idioma.CLId_NivEscribe = nivelEscritura.ToString();
                        idioma.CLId_NivHabla = nivelHablado.ToString();
                        idioma.CLId_NivLee = nivelLectura.ToString();
                        data.IN_CLIENTE_IDIOMA.InsertOnSubmit(idioma);
                    }
                    data.SubmitChanges();
                }
            }
            catch
            {
                exito = false;

            }

            return exito;
        }
        /// <summary>
        /// Se lista los idiomas del cliente
        /// </summary>
        /// <param name="idCliente"></param>
        /// <returns></returns>
        public static List<IN_CLIENTE_IDIOMA> ListarClienteIdioma(int idPostulante)
        {
            using (var data = new InscripcionDataContext())
            {
                IN_POSTULANTE post = data.IN_POSTULANTE.FirstOrDefault(x => x.Post_ID == idPostulante);
                return data.IN_CLIENTE_IDIOMA.Where(x => x.Clie_ID == post.Clie_ID).ToList();
            }

        }
        /// <summary>
        /// Se obtiene un registro de idioma del cliente
        /// </summary>
        /// <param name="ID"></param>
        /// <returns></returns>
        public static IN_CLIENTE_IDIOMA ObtenerClienteIdioma(int ID)
        {
            using (var data = new InscripcionDataContext())
            {
                return data.IN_CLIENTE_IDIOMA.Where(x => x.CLId_ID == ID).FirstOrDefault();
            }

        }

        /// <summary>
        /// Se elimina un registro del cliente
        /// </summary>
        /// <param name="ID">Identificador del Idioma a eliminar</param>
        /// <returns>Valor booleano indicando el éxito de la transacción</returns>
        public static bool EliminarClienteIdioma(int ID)
        {
            bool exito = true;
            try
            {
                using (var data = new InscripcionDataContext())
                {
                    var eliminar = data.IN_CLIENTE_IDIOMA.Where(x => x.CLId_ID == ID).FirstOrDefault();
                    data.IN_CLIENTE_IDIOMA.DeleteOnSubmit(eliminar);
                    data.SubmitChanges();
                }
            }
            catch
            {
                exito = false;
            }

            return exito;
        }

        /// <summary>
        /// Se registra la experiencia laboral del cliente
        /// </summary>
        /// <param name="idPostulante"></param>
        /// <param name="nombreEmpresa"></param>
        /// <param name="cargo"></param>
        /// <param name="sueldo"></param>
        /// <param name="area"></param>
        /// <param name="fechaInicio"></param>
        /// <param name="fechaFin"></param>
        /// <param name="jefeInmediato"></param>
        /// <param name="jefeTelefono"></param>
        /// <param name="rubro"></param>
        /// <returns></returns>
        public static bool RegistrarClienteExperienciaLaboral(int ID, int idPostulante,
                                                              string nombreEmpresa,
                                                              string cargo,
                                                              decimal sueldo,
                                                              string area,
                                                              DateTime fechaInicio,
                                                              DateTime fechaFin,
                                                              string jefeInmediato,
                                                              string jefeTelefono,
                                                              string rubro)
        {
            bool exito = true;

            try
            {
                IN_CLIENTE_EXPERIENCIA_LABORAL experiencia;
                using (var data = new InscripcionDataContext())
                {
                    //Se obtiene el cliente del postulante

                    var idCliente = data.IN_POSTULANTE.FirstOrDefault(x => x.Post_ID == idPostulante).Clie_ID;
                    //idioma = data.IN_CLIENTE_IDIOMA.FirstOrDefault(x => x.Clie_ID == idCliente);

                    if (ID != -1)
                    {
                        experiencia = new IN_CLIENTE_EXPERIENCIA_LABORAL();
                        experiencia = data.IN_CLIENTE_EXPERIENCIA_LABORAL.FirstOrDefault(x => x.ExLa_ID == ID);
                        experiencia.ExLa_NomEmpresa = nombreEmpresa;
                        experiencia.ExLa_DescripcionCargo = cargo;
                        experiencia.ExLa_Sueldo = sueldo;
                        experiencia.ExLa_FecInicio = fechaInicio;
                        experiencia.ExLa_FecFinal = fechaFin;
                        experiencia.ExLa_JefeInmediato = jefeInmediato;
                        experiencia.ExLa_Telefono = jefeTelefono;
                        experiencia.ExLa_ActividadEmpresa = rubro;
                        experiencia.ExLa_NomArea = area;
                        experiencia.Clie_ID = idCliente;
                    }
                    else
                    {
                        experiencia = new IN_CLIENTE_EXPERIENCIA_LABORAL();
                        experiencia.ExLa_NomEmpresa = nombreEmpresa;
                        experiencia.ExLa_DescripcionCargo = cargo;
                        experiencia.ExLa_Sueldo = sueldo;
                        experiencia.ExLa_FecInicio = fechaInicio;
                        experiencia.ExLa_FecFinal = fechaFin;
                        experiencia.ExLa_JefeInmediato = jefeInmediato;
                        experiencia.ExLa_Telefono = jefeTelefono;
                        experiencia.ExLa_ActividadEmpresa = rubro;
                        experiencia.ExLa_NomArea = area;
                        experiencia.Clie_ID = idCliente;

                        data.IN_CLIENTE_EXPERIENCIA_LABORAL.InsertOnSubmit(experiencia);
                    }

                    data.SubmitChanges();

                }
            }
            catch
            {
                exito = false;

            }
            return exito;
        }
        /// <summary>
        /// Se lista las experiencias laborales del cliente
        /// </summary>
        /// <param name="idCliente"></param>
        /// <returns></returns>
        public static List<IN_CLIENTE_EXPERIENCIA_LABORAL> ListarClienteExperienciaLaboral(int idPostulante)
        {
            using (var data = new InscripcionDataContext())
            {
                IN_POSTULANTE post = data.IN_POSTULANTE.FirstOrDefault(x => x.Post_ID == idPostulante);
                return data.IN_CLIENTE_EXPERIENCIA_LABORAL.Where(x => x.Clie_ID == post.Clie_ID).ToList();
            }

        }
        /// <summary>
        /// Se obtiene la experiencia laboral del cliente
        /// </summary>
        /// <param name="ID"></param>
        /// <returns></returns>
        public static IN_CLIENTE_EXPERIENCIA_LABORAL ObtenerClienteExperienciaLaboral(int ID)
        {
            using (var data = new InscripcionDataContext())
            {
                return data.IN_CLIENTE_EXPERIENCIA_LABORAL.FirstOrDefault(x => x.ExLa_ID == ID);
            }

        }
        /// <summary>
        /// Se elimina las experiencias laborales del cliente
        /// </summary>
        /// <param name="ID"></param>
        /// <returns></returns>
        public static bool EliminarClienteExperienciaLaboral(int ID)
        {
            bool exito = true;
            try
            {
                using (var data = new InscripcionDataContext())
                {
                    var eliminar = data.IN_CLIENTE_EXPERIENCIA_LABORAL.Where(x => x.ExLa_ID == ID).FirstOrDefault();
                    data.IN_CLIENTE_EXPERIENCIA_LABORAL.DeleteOnSubmit(eliminar);
                    data.SubmitChanges();
                }
            }
            catch
            {
                exito = false;
            }

            return exito;
        }
        /// <summary>
        /// Se elimina la formación académica del cliente
        /// </summary>
        /// <param name="ID"></param>
        /// <returns></returns>
        public static bool EliminarClienteFormacionAcademica(int OEst_ID)
        {
            bool exito = true;
            try
            {
                using (var data = new InscripcionDataContext())
                {
                    var eliminar = data.IN_CLIENTE_FORMACION_ACADEMICA.Where(x => x.OEst_ID == OEst_ID).FirstOrDefault();
                    data.IN_CLIENTE_FORMACION_ACADEMICA.DeleteOnSubmit(eliminar);
                    data.SubmitChanges();
                }
            }
            catch
            {
                exito = false;
            }

            return exito;
        }


        /// <summary>
        /// Se registra la formación académica del cliente
        /// </summary>
        /// <param name="idPostulante"></param>
        /// <param name="nombreCentro"></param>
        /// <param name="idPais"></param>
        /// <param name="fechaInicio"></param>
        /// <param name="fechaFin"></param>
        /// <param name="profesion"></param>
        /// <param name="anno"></param>
        /// <returns></returns>
        public static bool RegistrarClienteFormacionAcademica(int ID, int idPostulante,
                                                              string nombreCentro,
                                                              int idPais,
                                                              DateTime fechaInicio,
                                                              DateTime fechaFin,
                                                              string profesion,
                                                              string anno)
        {
            bool exito = true;
            try
            {

                IN_CLIENTE_FORMACION_ACADEMICA formacion;
                using (var data = new InscripcionDataContext())
                {
                    //Se obtiene el cliente del postulante

                    var idCliente = data.IN_POSTULANTE.FirstOrDefault(x => x.Post_ID == idPostulante).Clie_ID;
                    //idioma = data.IN_CLIENTE_IDIOMA.FirstOrDefault(x => x.Clie_ID == idCliente);                    
                    if (ID != -1)
                    {
                        formacion = new IN_CLIENTE_FORMACION_ACADEMICA();

                        formacion = data.IN_CLIENTE_FORMACION_ACADEMICA.FirstOrDefault(x => x.OEst_ID == ID);
                        formacion.OEst_CentroEstudio = nombreCentro;
                        formacion.OEst_PaisID = idPais;
                        formacion.OEst_FecInicio = fechaInicio;
                        formacion.OEst_FecFin = fechaFin;
                        formacion.OEst_Profesion = profesion;
                        formacion.OEst_Anno = int.Parse(anno);
                        formacion.Clie_ID = idCliente;
                    }
                    else
                    {
                        formacion = new IN_CLIENTE_FORMACION_ACADEMICA();
                        formacion.OEst_CentroEstudio = nombreCentro;
                        formacion.OEst_PaisID = idPais;
                        formacion.OEst_FecInicio = fechaInicio;
                        formacion.OEst_FecFin = fechaFin;
                        formacion.OEst_Profesion = profesion;
                        formacion.OEst_Anno = int.Parse(anno);
                        formacion.Clie_ID = idCliente;

                        data.IN_CLIENTE_FORMACION_ACADEMICA.InsertOnSubmit(formacion);
                    }


                    data.SubmitChanges();

                }
            }
            catch
            {
                exito = false;

            }
            return exito;
        }
        /// <summary>
        /// Se listan los registros de formación académica del cliente
        /// </summary>
        /// <param name="idCliente"></param>
        /// <returns></returns>
        public static List<IN_CLIENTE_FORMACION_ACADEMICA> ListarClienteFormacionAcademica(int idPostulante)
        {
            using (var data = new InscripcionDataContext())
            {
                int idCliente = (int)data.IN_POSTULANTE.FirstOrDefault(x => x.Post_ID == idPostulante).Clie_ID;
                return data.IN_CLIENTE_FORMACION_ACADEMICA.Where(x => x.Clie_ID == idCliente).ToList();
            }
        }
        /// <summary>
        /// Se obtiene la formacion academica del cliente
        /// </summary>
        /// <param name="ID"></param>
        /// <returns></returns>
        public static IN_CLIENTE_FORMACION_ACADEMICA ObtenerClienteFormacionAcademica(int ID)
        {
            using (var data = new InscripcionDataContext())
            {
                return data.IN_CLIENTE_FORMACION_ACADEMICA.FirstOrDefault(x => x.OEst_ID == ID);
            }
        }

        /// <summary>
        /// Se actualiza la informacion personal del cliente
        /// </summary>
        /// <param name="cliente"></param>
        /// <returns></returns>
        public static bool ActualizarClienteInformacionPersonal(IN_CLIENTE cliente, int idPostulante)
        {
            bool exito = true;

            try
            {
                IN_CLIENTE update = new IN_CLIENTE();
                using (var data = new InscripcionDataContext())
                {
                    var idCliente = data.IN_POSTULANTE.FirstOrDefault(x => x.Post_ID == idPostulante).Clie_ID;

                    update = data.IN_CLIENTE.FirstOrDefault(x => x.Clie_ID == idCliente);
                    update.Clie_NomCompleto = cliente.Clie_NomCompleto;
                    update.Clie_ApePaterno = cliente.Clie_ApePaterno;
                    update.Clie_ApeMaterno = cliente.Clie_ApeMaterno;
                    update.Clie_Nombre = cliente.Clie_Nombre;
                    update.Clie_Sexo = cliente.Clie_Sexo;
                    update.Clie_EstCivil = cliente.Clie_EstCivil;
                    update.Clie_PaisNaci = cliente.Clie_PaisNaci;
                    update.Clie_Telefono = cliente.Clie_Telefono;
                    update.Clie_Email = cliente.Clie_Email;
                    update.Clie_Direccion = cliente.Clie_Direccion;
                    update.Clie_TipDocIden = cliente.Clie_TipDocIden;
                    update.Clie_NumDocIden = cliente.Clie_NumDocIden;
                    update.Clie_FecNaci = cliente.Clie_FecNaci;

                    data.SubmitChanges();

                }
            }
            catch
            {
                exito = false;

            }

            return exito;
        }


    }
}
